//============================================================================================
/**
 * @file	report_poketch.c
 * @brief	セーブ時下画面インターフェース
 * @author	AkitoMori GAME FREAK inc.
 */
//============================================================================================

// でんわテスト
//#define DEBUG_PHONE

#include "common.h"
#include "tcb.h"
#include "system\arc_util.h"
#include "system/clact_tool.h"
#include "system/lib_pack.h"
#include "system/snd_tool.h"
#include "system/fontoam.h"
#include "system/fontproc.h"
#include "system/touch_subwindow.h"
#include "system/pmfprint.h"
#include "gflib/touchpanel.h"
#include "system/window.h"
#include "field/poketch.h"
#include "field/syswork.h"
#include "msgdata/msg.naix"
#include "msgdata/msg_fieldmenu.h"
#include "system\wordset.h"
#include "system\msgdata_util.h"
#include "field/sysflag.h"
#include "field/fld_pmtel.h"
#include "field/fld_bmp.h"
#include "field/field_poketch.h"
#include "AMProtect/AMProtect.h"

#include "../report.h"

#include "poketch_arc.h"
#include "msgdata/msg_common_scr.h"

#define MENU_OAM_NUM		( 14 )
#define SHORTCUT_OAM_NUM	( 3 )
#define CURSOR_OAM_NUM		( 4 )
#define MENU_ALL_OAM_NUM	( MENU_OAM_NUM + SHORTCUT_OAM_NUM + CURSOR_OAM_NUM )

#define MENU_MAX			(  9 )

// CLACTで定義しているセルが大きすぎてサブ画面に影響がでてしまうので離してみる
#define SUBLCD_MENU_SUB_ACTOR_DISTANCE 	(256*FX32_ONE)

// CellActorに処理させるリソースマネージャの種類の数（＝マルチセル・マルチセルアニメは使用しない）
#define CLACT_RESOURCE_TYPE_NUM		(  4 )

// システムメニューのセルアクターが読み込むキャラ・パレット（セットで）の総数
#define CLACT_RESOURCE_CHARA_NUM	( 10 )

#define SUBLCD_OAM_NUM			( 13 )
#define CLACT_RESOURCE_TBL_NUM	(  2 )
#define REPORT_END_WAIT			( 30 )

#define HEAPID_SUBLCD_MENU		( HEAPID_POKETCH_APP )
#define ARC_SUBLCDMENU_GRA		( ARC_POKETCH_IMG )


//有効にすると無限にセーブを繰り返すテスト
//#define REPEAT_SAVE_TEST


enum{
	SEQ_START=0,
	SEQ_TALK,
	SEQ_TALK_WAIT_NEXT,
	SEQ_YESNO1_START,
	SEQ_YESNO1_WAIT,
	SEQ_OVERWRITE_TALK,
	SEQ_YESNO2_START,
	SEQ_YESNO2_WAIT,
	SEQ_NOSAVE_RESULT,
	SEQ_NOSAVE_END_WAIT,
	SEQ_SAVE_TALK,
	SEQ_SAVEICON_START,
	SEQ_SAVE,
	SEQ_END_TALK,
	SEQ_REPORT_END_SE,
	SEQ_REPORT_END,

};

//------------------------------------------------------------------
/// 構造体定義
//------------------------------------------------------------------
typedef struct {
	int     	screen;
	GF_BGL_INI	*bgl;
	TCB_PTR 	tcb;
	int			subseq;
	int			nextseq;
	int			wait;

	u16         *panel_trg;
	FIELDSYS_WORK    *fsys;

	GF_BGL_BMPWIN			MenuBmp;			// 選択中の項目を説明する文章を表示するBMPWIN領域
	int						MenuNameOn;			// MenuBmpを表示しているか。

	MSGDATA_MANAGER 		*msgman;
	MSGDATA_MANAGER 		*savemsgman;
	WORDSET					*WordSet;			// メッセージ展開用ワークマネージャー


	REPORT_INFO 			*riw;
	CONFIG 					*config;

	//はい・いいえタッチパネル関連
	TOUCH_SW_SYS*			tpSWsys;
	GF_BGL_BMPWIN			TalkWinBmp;			// 選択中の項目を説明する文章を表示するBMPWIN領域
	STRBUF					*savestr;
	int						msg_index;

	void					*TimeWaitIconPtr;	//

	TCB_PTR 				SaveDrawTcb;

}REPORT_SUBLCD_WORK;

//------------------------------------------------------------------
/// プロトタイプ宣言
//------------------------------------------------------------------
static void _bg_set( REPORT_SUBLCD_WORK *rsw );
static void _bg_release( REPORT_SUBLCD_WORK *rsw );
static void _sublcd_task( TCB_PTR tcb, void *wk );

static void _string_get( REPORT_SUBLCD_WORK *rsw, int flag );
static void _string_release( REPORT_SUBLCD_WORK *rsw );
static void _yesno_start( REPORT_SUBLCD_WORK *rsw );

static void _talk_next_set( REPORT_SUBLCD_WORK *rsw, int nextseq );
static void _set_decide_style( KEYTOUCH_STATUS *kt_st, int type );


static int _report_seq_start( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_talk( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_talk_wait_next( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_yesno1_start( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_yesno1_wait( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_overwrite_talk( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_yesno2_start( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_yesno2_wait( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_nosave_result( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_nosave_end_wait( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_save_talk( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_saveicon_start( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_save( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_end_talk( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_report_end_se( REPORT_SUBLCD_WORK *rsw );
static int _report_seq_report_end( REPORT_SUBLCD_WORK *rsw );

static int _all_save_check( REPORT_SUBLCD_WORK *rsw );

static void MagiconFunc1(void);
static void MagiconFunc2(void);
static void NotMagiconFunc(void);

// サブシーケンス定義表
static int (*sub_seq_table[])( REPORT_SUBLCD_WORK *rsw )={

	_report_seq_start,
	_report_seq_talk,
	_report_seq_talk_wait_next,
	_report_seq_yesno1_start,
	_report_seq_yesno1_wait,
	_report_seq_overwrite_talk,
	_report_seq_yesno2_start,
	_report_seq_yesno2_wait,
	_report_seq_nosave_result,
	_report_seq_nosave_end_wait,
	_report_seq_save_talk,
	_report_seq_saveicon_start,
	_report_seq_save,
	_report_seq_end_talk,
	_report_seq_report_end_se,
	_report_seq_report_end,

};



//------------------------------------------------------------------
/**
 * ポケッチ取得以前の画面構築
 *
 * @param   none
 *
 */
//------------------------------------------------------------------
TCB_PTR ReportSublcdInit( GF_BGL_INI* bgl, u16 *sub_panel_trg, FIELDSYS_WORK *fsys, void *work )
{
	TCB_PTR       tcb;

	static const GF_BGL_BGCNT_HEADER header[] = {
		{
			0, 0, 0x800, 0,	// scrX, scrY, scrbufSize, scrbufofs,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x6800, GX_BG_CHARBASE_0x00000,
			GX_BG_EXTPLTT_01, 2, 0, 0, FALSE	// pal, pri, areaover, dmy, mosaic
		},
		{
			0, 0, 0x800, 0,	// scrX, scrY, scrbufSize, scrbufofs,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x7000, GX_BG_CHARBASE_0x00000,
			GX_BG_EXTPLTT_01, 0, 0, 0, FALSE	// pal, pri, areaover, dmy, mosaic

		},
		{
			0, 0, 0x800, 0,	// scrX, scrY, scrbufSize, scrbufofs,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x6000, GX_BG_CHARBASE_0x04000,
			GX_BG_EXTPLTT_01, 1, 0, 0, FALSE	// pal, pri, areaover, dmy, mosaic

		},
	};

	// 異様にデカいがポケッチの合計と同じにしておく
	sys_CreateHeap( HEAPID_BASE_APP, HEAPID_SUBLCD_MENU,  0x18000 );



// BG 設定
	GXS_SetGraphicsMode(GX_BGMODE_0);

	GX_SetBankForSubBG(GX_VRAM_SUB_BG_32_H);
	GX_SetBankForSubOBJ(GX_VRAM_SUB_OBJ_16_I);
	GXS_SetOBJVRamModeChar( GX_OBJVRAMMODE_CHAR_1D_32K );
	GF_BGL_BGControlSet( bgl, GF_BGL_FRAME0_S, &header[0], GF_BGL_MODE_TEXT );
	GF_BGL_BGControlSet( bgl, GF_BGL_FRAME1_S, &header[1], GF_BGL_MODE_TEXT );
	GF_BGL_BGControlSet( bgl, GF_BGL_FRAME2_S, &header[2], GF_BGL_MODE_TEXT );
	GF_BGL_ClearCharSet( GF_BGL_FRAME2_S, 32, 0, HEAPID_FIELD );
	GF_BGL_ScrClear( bgl, GF_BGL_FRAME2_S );
	GF_BGL_ScrClear( bgl, GF_BGL_FRAME1_S );

	GXS_SetVisibleWnd( GX_WNDMASK_NONE );
	GF_Disp_GXS_VisibleControl(GX_PLANEMASK_BG0, VISIBLE_OFF);	//OBJ面OFF
	GF_Disp_GXS_VisibleControl(GX_PLANEMASK_BG1, VISIBLE_OFF);	//OBJ面OFF
	GF_Disp_GXS_VisibleControl(GX_PLANEMASK_BG2, VISIBLE_OFF);	//OBJ面OFF
	GF_Disp_GXS_VisibleControl(GX_PLANEMASK_OBJ, VISIBLE_OFF);	//OBJ面OFF

	{
		REPORT_SUBLCD_WORK *rsw;
		int i;

		tcb             = PMDS_taskAdd( _sublcd_task, sizeof(REPORT_SUBLCD_WORK), 10, HEAPID_SUBLCD_MENU);
		rsw             = TCB_GetWork(tcb);
		rsw->tcb        = tcb;
		rsw->screen     = 0;
		rsw->bgl        = bgl;
		rsw->panel_trg  = sub_panel_trg;
		rsw->fsys       = fsys;
		rsw->MenuNameOn = 0;
		rsw->config    	= SaveData_GetConfig(rsw->fsys->savedata);
		rsw->subseq     = SEQ_START;

		// BG転送
		_bg_set( rsw );


		// メニュー文字列取得と初期位置の文字描画

		_string_get( rsw, rsw->fsys->sublcd_menu_on );
		OS_Printf("menu_on_flag = %d\n", rsw->fsys->sublcd_menu_on);


	}

//	GXS_SetVisiblePlane( GX_PLANEMASK_BG0|GX_PLANEMASK_BG1|GX_PLANEMASK_BG2 );
	GF_Disp_GXS_VisibleControl(GX_PLANEMASK_BG0, VISIBLE_ON);	//OBJ面ＯＮ
	GF_Disp_GXS_VisibleControl(GX_PLANEMASK_BG1, VISIBLE_ON);	//OBJ面ＯＮ
	GF_Disp_GXS_VisibleControl(GX_PLANEMASK_BG2, VISIBLE_ON);	//OBJ面ＯＮ
	GF_Disp_GXS_VisibleControl(GX_PLANEMASK_OBJ, VISIBLE_ON);	//OBJ面ＯＮ

	// 会話ウインドウタッチ有効
	MsgPrintTouchPanelFlagSet( MSG_TP_ON );

	return tcb;
}


FS_EXTERN_OVERLAY(amprotect);

//==============================================================================
/**
 * @brief   終了リクエスト
 *
 * @param   bgl
 * @param   tcb
 *
 * @retval  none
 */
//==============================================================================
void ReportSublcdQuitReq( GF_BGL_INI* bgl,  TCB_PTR tcb )
{
	int i;

	REPORT_SUBLCD_WORK *rsw = TCB_GetWork(tcb);

#if MAGICON_CHECK
    FS_LoadOverlay( MI_PROCESSOR_ARM9, FS_OVERLAY_ID(amprotect) );

	if (!AM_IsNotMagiconA1(NotMagiconFunc)) {
		sys_AllocMemoryLo( HEAPID_BASE_APP, 1000 );
    }
#endif

	OS_Printf("tcb=%08x\n",tcb);

	ReportSubLcd_EraseWindow(rsw->riw);
	ReportSubLcd_Delete(rsw->riw);

	// 会話ウインドウタッチ有効
	MsgPrintTouchPanelFlagSet( MSG_TP_OFF );

#if MAGICON_CHECK
    if (AM_IsMagiconA2(MagiconFunc1)) {
		sys_AllocMemoryLo( HEAPID_BASE_APP, 1000 );
    }
#endif

	// BG周り解放
	_bg_release( rsw );

	// メニュー文字列解放
	_string_release( rsw );

	PMDS_taskDel( tcb );

	GF_BGL_BGControlExit( bgl, GF_BGL_FRAME2_S );
	GF_BGL_BGControlExit( bgl, GF_BGL_FRAME1_S );
	GF_BGL_BGControlExit( bgl, GF_BGL_FRAME0_S );
	sys_DeleteHeap( HEAPID_SUBLCD_MENU );


#if MAGICON_CHECK
    if (AM_IsMagiconA3(MagiconFunc2)) {
		sys_AllocMemoryLo( HEAPID_BASE_APP, 1000 );
    }

	FS_UnloadOverlay(MI_PROCESSOR_ARM9, FS_OVERLAY_ID(amprotect));
#endif


}

//==============================================================================
/**
 * @brief   終了待ち（即終了）
 *
 * @param   bgl
 *
 * @retval  BOOL
 */
//==============================================================================
BOOL ReportSublcdQuitWait( GF_BGL_INI* bgl )
{
	return TRUE;
}

#define TALK_BMPWIN_CGX			(32*4)
#define TALK_WINDOW_CGX			(TALK_BMPWIN_CGX+(FLD_MSG_WIN_SX*FLD_MSG_WIN_SY))
#define TALK_WINDOW_PAL			(  5 )
#define TALK_STRING_PAL		 	(  4 )

//------------------------------------------------------------------
/**
 * @brief   下画面レポート
 *
 * @param   tcb
 * @param   wk
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _sublcd_task( TCB_PTR tcb, void *wk )
{
	int i;
	REPORT_SUBLCD_WORK *rsw = (REPORT_SUBLCD_WORK *)wk;

	// イベント中か？
	if(!FieldEvent_Check( rsw->fsys )){

		// 閉じた時の挙動
		if(rsw->fsys->sublcd_menu_on==2){
			rsw->fsys->sublcd_menu_on=3;

			ReportSubLcd_EraseWindow(rsw->riw);
		}

		G2S_BlendNone();

	}else{
		// イベント中で、しかもメインメニューを開いている
		if(	rsw->fsys->sublcd_menu_on==2 ){

			if( sub_seq_table[rsw->subseq](rsw)==TRUE ){
				rsw->fsys->sublcd_menu_on = 3;
//				rsw->fsys->sublcd_menu_on = 1;
				FieldSubLcdControler_ChangeApp( rsw->fsys, SUBLCD_MODE_FIELD_MENU, NULL );
			}else{
//				FieldMenuSubLcdReturn( SUBLCD_MODE_FIELD_MENU );
			}
		}else{
			// イベント中でメインメニューを開いていない（会話やスクリプトが動作している）
		}
	}



}



//==============================================================================
/**
 * @brief   指定のパレット・キャラ・スクリーンを下画面用に転送
 *
 * @param   bgl
 *
 * @retval  none
 */
//==============================================================================
static void _bg_set( REPORT_SUBLCD_WORK *rsw )
{

	G2S_BlendNone();

	// BG0面の転送
	ArcUtil_BgCharSet(ARC_SUBLCDMENU_GRA, NARC_poketch_report_bg_ncgr, rsw->bgl, GF_BGL_FRAME0_S,
		0, 0, TRUE, HEAPID_POKETCH_APP);
	ArcUtil_ScrnSet(ARC_SUBLCDMENU_GRA, NARC_poketch_report_bg_nscr, rsw->bgl, GF_BGL_FRAME0_S,
		0, 0, TRUE, HEAPID_POKETCH_APP);
	ArcUtil_PalSet(ARC_SUBLCDMENU_GRA, NARC_poketch_report_nclr, PALTYPE_SUB_BG,
		0, 0x200, HEAPID_POKETCH_APP);


	// フォントパレット転送
	SystemFontPaletteLoad( PALTYPE_SUB_BG, TALK_STRING_PAL*0x20, HEAPID_POKETCH_APP );


	// メニュー説明文字列用BMPWIN確保
	GF_BGL_BmpWinAdd( rsw->bgl, &rsw->TalkWinBmp, GF_BGL_FRAME1_S,
			FLD_MSG_WIN_PX,  FLD_MSG_WIN_PY,
			FLD_MSG_WIN_SX, FLD_MSG_WIN_SY,
			TALK_STRING_PAL,  TALK_BMPWIN_CGX );
	GF_BGL_BmpWinDataFill( &rsw->TalkWinBmp, 0xff );


	// 会話ウインドウグラフィックセット
	TalkWinGraphicSet(
		rsw->bgl, GF_BGL_FRAME1_S, TALK_WINDOW_CGX, TALK_WINDOW_PAL,
		CONFIG_GetWindowType(rsw->config), HEAPID_FIELD );

}


//------------------------------------------------------------------
/**
 * @brief   ＢＧ周り解放
 *
 * @param   rsw
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _bg_release( REPORT_SUBLCD_WORK *rsw )
{
	GF_BGL_BmpWinDel( &rsw->TalkWinBmp );
}





//------------------------------------------------------------------
/**
 * @brief   文字列の取得準備
 *
 * @param   rsw
 * @param   flag	描画している面では文字描画の必要があるか？
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _string_get( REPORT_SUBLCD_WORK *rsw, int flag )
{

	// メッセージマネージャ初期化
	// 文字列マネージャー初期化

	rsw->WordSet    = WORDSET_Create( HEAPID_SUBLCD_MENU );
	rsw->savemsgman = MSGMAN_Create( MSGMAN_TYPE_NORMAL, ARC_MSG, NARC_msg_common_scr_dat, HEAPID_SUBLCD_MENU );

	// 主人公名登録
	WORDSET_RegisterPlayerName( rsw->WordSet, 0, SaveData_GetMyStatus(rsw->fsys->savedata) );


}

//------------------------------------------------------------------
/**
 * @brief   文字列マネージャーの解放
 *
 * @param   rsw
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _string_release( REPORT_SUBLCD_WORK *rsw )
{

	MSGMAN_Delete(  rsw->savemsgman  );
	WORDSET_Delete( rsw->WordSet );

}



//------------------------------------------------------------------
/**
 * @brief   はい・いいえ共通処理初期化
 *
 * @param   rsw
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _yesno_start( REPORT_SUBLCD_WORK *rsw )
{
	TOUCH_SW_PARAM tp_param;
	MI_CpuClear8(&tp_param,sizeof(TOUCH_SW_PARAM));

	// 初期化パラメータ設定
	tp_param.p_bgl 		= rsw->bgl;
	tp_param.bg_frame	= GF_BGL_FRAME2_S;
	tp_param.char_offs	= 1;
	tp_param.pltt_offs	= 12;
	tp_param.x			= 26;
	tp_param.y			= 10;
	tp_param.kt_st      = APP_KTST_KEY;
	tp_param.key_pos    = 0;			//yesがカレント

	GF_BGL_ScrClear( rsw->bgl, GF_BGL_FRAME2_S );

	//はい・いいえタッチパネルシステム読み込み
	rsw->tpSWsys = TOUCH_SW_AllocWork( HEAPID_FIELD );
	TOUCH_SW_Init( rsw->tpSWsys, &tp_param );

}



//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
// サブシーケンス
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------


//==============================================================================
/**
 * @brief   会話待ちの後に遷移するシーケンスをセットする
 *
 * @param   rsw
 * @param   nextseq		会話待ちの後のサブシーケンス
 *
 * @retval  statoc void
 */
//==============================================================================
static void _talk_next_set( REPORT_SUBLCD_WORK *rsw, int nextseq )
{
	rsw->subseq  = SEQ_TALK_WAIT_NEXT;
	rsw->nextseq = nextseq;
}

//------------------------------------------------------------------
/**
 * @brief   レポートにかきこみますか？画面作成
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_start( REPORT_SUBLCD_WORK *rsw )
{
    rsw->riw = ReportSubLcd_Create(rsw->fsys, HEAPID_FIELD, GF_BGL_FRAME1_S);
 	ReportSubLcd_WriteWindow(rsw->riw);

	rsw->subseq = SEQ_TALK;


	return FALSE;
}

//------------------------------------------------------------------
/**
 * @brief   会話開始
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_talk( REPORT_SUBLCD_WORK *rsw )
{

	// 他のセーブデータが書き込まれていないかチェック
   	if (!SaveData_IsOverwritingOtherData(rsw->fsys->savedata)) {

		// 会話ウインドウ描画
		BmpTalkWinWrite( &rsw->TalkWinBmp, WINDOW_TRANS_OFF, TALK_WINDOW_CGX, TALK_WINDOW_PAL );


		rsw->savestr = MSGMAN_AllocString( rsw->savemsgman, msg_common_report_11 );

		// レポートに書き込みますか？表示開始
		rsw->msg_index = GF_STR_PrintSimple( &rsw->TalkWinBmp, FONT_TALK, rsw->savestr, 0, 0,
									CONFIG_GetMsgPrintSpeed(rsw->config), NULL );

		_talk_next_set( rsw, SEQ_YESNO1_START );
	}else{

		// 他のセーブデータがあるので書き込めません
		rsw->subseq = SEQ_NOSAVE_RESULT;
	}


	return FALSE;
}


//------------------------------------------------------------------
/**
 * @brief   会話表示待ちの後、指定のシーケンスに飛ばす共通処理
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_talk_wait_next( REPORT_SUBLCD_WORK *rsw )
{
	// メッセージ表示終了待ち
	if(!GF_MSG_PrintEndCheck(rsw->msg_index)){
		STRBUF_Delete(rsw->savestr);

		// メッセージ表示終了後のサブシーケンスをセット
		rsw->subseq = rsw->nextseq;
	}

	return FALSE;

}

//------------------------------------------------------------------
/**
 * @brief   レポートを書きますか？のはい・いいえ開始
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_yesno1_start( REPORT_SUBLCD_WORK *rsw )
{

	_yesno_start( rsw );

	rsw->subseq = SEQ_YESNO1_WAIT;
	return FALSE;

}

//------------------------------------------------------------------
/**
 * @brief   レポートを書きますか？のはい・いいえ待ち
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_yesno1_wait( REPORT_SUBLCD_WORK *rsw )
{
	int result = TOUCH_SW_MainMC( rsw->tpSWsys );

	switch(result){
	case TOUCH_SW_RET_YES:
//	case TOUCH_SW_RET_YES_TOUCH:	// タッチした瞬間の戻り値なので、いらない
//
		// 決定時の方法を伝える
		_set_decide_style( &rsw->fsys->KeyTouchStatus, TOUCH_SW_GetKTStatus( rsw->tpSWsys ) );

		//はい・いいえタッチパネルシステム破棄
		TOUCH_SW_FreeWork( rsw->tpSWsys );


		// 初セーブかどうかチェック
		if( SaveData_GetExistFlag( rsw->fsys->savedata )==TRUE ){
			// 上書き確認へ
			rsw->subseq = SEQ_OVERWRITE_TALK;
		}else{
			// 初セーブ
			rsw->subseq = SEQ_SAVE_TALK;
		}
		break;

	case TOUCH_SW_RET_NO:
//	case TOUCH_SW_RET_NO_TOUCH:		// タッチした瞬間の戻り値なので、いらない
		// 決定時の方法を伝える
		_set_decide_style( &rsw->fsys->KeyTouchStatus, TOUCH_SW_GetKTStatus( rsw->tpSWsys ) );

		//はい・いいえタッチパネルシステム破棄
		TOUCH_SW_FreeWork( rsw->tpSWsys );

//		rsw->subseq = SEQ_REPORT_END;
		return TRUE;
		break;
	}


	return FALSE;

}

//------------------------------------------------------------------
/**
 * @brief  うえから書いてもいいですか？
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_overwrite_talk( REPORT_SUBLCD_WORK *rsw )
{

	GF_BGL_BmpWinDataFill( &rsw->TalkWinBmp, 0xff );

	rsw->savestr = MSGMAN_AllocString( rsw->savemsgman, msg_common_report_12 );

	// 上書きしますか？表示開始
	rsw->msg_index = GF_STR_PrintSimple( &rsw->TalkWinBmp, FONT_TALK, rsw->savestr, 0, 0,
									CONFIG_GetMsgPrintSpeed(rsw->config), NULL );

	_talk_next_set( rsw, SEQ_YESNO2_START );

	return FALSE;
}

//------------------------------------------------------------------
/**
 * @brief   よろしいですか？のはい・いいえ開始
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_yesno2_start( REPORT_SUBLCD_WORK *rsw )
{
	_yesno_start( rsw );

	rsw->subseq = SEQ_YESNO2_WAIT;
	return FALSE;

}

//------------------------------------------------------------------
/**
 * @brief   よろしいですか？はい・いいえ待ち
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_yesno2_wait( REPORT_SUBLCD_WORK *rsw )
{

	int result = TOUCH_SW_MainMC( rsw->tpSWsys );

	OS_TPrintf("****** result:%d \n", result);

	switch(result){
	case TOUCH_SW_RET_YES:
//	case TOUCH_SW_RET_YES_TOUCH:	// タッチした瞬間の戻り値なので、いらない
		// 決定時の方法を伝える
		_set_decide_style( &rsw->fsys->KeyTouchStatus, TOUCH_SW_GetKTStatus( rsw->tpSWsys ) );

		//はい・いいえタッチパネルシステム破棄
		TOUCH_SW_FreeWork( rsw->tpSWsys );

		rsw->subseq = SEQ_SAVE_TALK;
		break;

	case TOUCH_SW_RET_NO:
//	case TOUCH_SW_RET_NO_TOUCH:		// タッチした瞬間の戻り値なので、いらない

		// 決定時の方法を伝える
		_set_decide_style( &rsw->fsys->KeyTouchStatus, TOUCH_SW_GetKTStatus( rsw->tpSWsys ) );

		//はい・いいえタッチパネルシステム破棄
		TOUCH_SW_FreeWork( rsw->tpSWsys );

//		rsw->subseq = SEQ_REPORT_END;
		return TRUE;
		break;
	}


	return FALSE;

}


//------------------------------------------------------------------
/**
 * @brief   別のセーブデータが存在しているので書き込めません。
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_nosave_result( REPORT_SUBLCD_WORK *rsw )
{

	// 会話ウインドウ描画
	BmpTalkWinWrite( &rsw->TalkWinBmp, WINDOW_TRANS_OFF, TALK_WINDOW_CGX, TALK_WINDOW_PAL );


	rsw->savestr = MSGMAN_AllocString( rsw->savemsgman, msg_common_report_08 );

	// 別なセーブデータが…
	rsw->msg_index = GF_STR_PrintSimple( &rsw->TalkWinBmp, FONT_TALK, rsw->savestr, 0, 0,
									CONFIG_GetMsgPrintSpeed(rsw->config), NULL );

	_talk_next_set( rsw, SEQ_NOSAVE_END_WAIT );

	return FALSE;

}


//------------------------------------------------------------------
/**
 * @brief   セーブしないで終了した
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_nosave_end_wait( REPORT_SUBLCD_WORK *rsw )
{
	rsw->subseq = SEQ_REPORT_END;
	rsw->wait   = 0;

	return FALSE;
}

//------------------------------------------------------------------
/**
 * @brief   書き込みを行っています
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_save_talk( REPORT_SUBLCD_WORK *rsw )
{
	GF_BGL_BmpWinDataFill( &rsw->TalkWinBmp, 0xff );

	rsw->SaveDrawTcb = Player_ReportDrawProcSet( rsw->fsys );

	if(_all_save_check( rsw )){
		// たくさん書き込む
		rsw->savestr = MSGMAN_AllocString( rsw->savemsgman, msg_common_report_09 );
	}else{
		// 短めセーブ
		rsw->savestr = MSGMAN_AllocString( rsw->savemsgman, msg_common_report_03 );
	}
	// レポートを(たくさん）書いています。
	rsw->msg_index = GF_STR_PrintSimple( &rsw->TalkWinBmp, FONT_TALK, rsw->savestr, 0, 0,
									CONFIG_GetMsgPrintSpeed(rsw->config), NULL );

	_talk_next_set( rsw, SEQ_SAVEICON_START );

	return FALSE;

}

//------------------------------------------------------------------
/**
 * @brief   セーブ待ちアニメアイコンを表示開始
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_saveicon_start( REPORT_SUBLCD_WORK *rsw )
{
    rsw->TimeWaitIconPtr = TimeWaitIconAdd( &rsw->TalkWinBmp , TALK_WINDOW_CGX);

	rsw->subseq = SEQ_SAVE;

	return FALSE;
}

//------------------------------------------------------------------
/**
 * @brief   セーブ処理
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_save( REPORT_SUBLCD_WORK *rsw )
{
	Field_Save(rsw->fsys);

	rsw->subseq = SEQ_END_TALK;
	return FALSE;

}

//------------------------------------------------------------------
/**
 * @brief   セーブが終了しました。
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_end_talk( REPORT_SUBLCD_WORK *rsw )
{

	Player_ReportDrawProcDelete( rsw->SaveDrawTcb );

    TimeWaitIconDel( rsw->TimeWaitIconPtr );

	GF_BGL_BmpWinDataFill( &rsw->TalkWinBmp, 0xff );

	rsw->savestr = MSGDAT_UTIL_AllocExpandString( rsw->WordSet, rsw->savemsgman,
													msg_common_report_04, HEAPID_SUBLCD_MENU );
	// セーブが終了しました
	rsw->msg_index = GF_STR_PrintSimple( &rsw->TalkWinBmp, FONT_TALK, rsw->savestr, 0, 0,
									CONFIG_GetMsgPrintSpeed(rsw->config), NULL );

	_talk_next_set( rsw, SEQ_REPORT_END_SE );

	return FALSE;

}


//------------------------------------------------------------------
/**
 * @brief   メッセージ終了後にSE鳴らす
 *
 * @param   rsw
 *
 * @retval  static
 */
//------------------------------------------------------------------
static int _report_seq_report_end_se( REPORT_SUBLCD_WORK *rsw )
{
	Snd_SePlay(SEQ_SE_DP_SAVE);

#ifdef REPEAT_SAVE_TEST
	if(sys.cont&PAD_BUTTON_B){
		rsw->subseq = SEQ_REPORT_END;
	}else{
		rsw->subseq = SEQ_SAVE_TALK;
	}
#else
	rsw->subseq = SEQ_REPORT_END;
#endif
	rsw->wait   = 0;

	return FALSE;
}

//------------------------------------------------------------------
/**
 * @brief   レポート処理終了（エラー・正常・途中終了も含む）
 *
 * @param   rsw
 *
 * @retval  int
 */
//------------------------------------------------------------------
static int _report_seq_report_end( REPORT_SUBLCD_WORK *rsw )
{
	if(++rsw->wait > REPORT_END_WAIT){
		return TRUE;
	}

	return FALSE;
}


//------------------------------------------------------------------
/**
 * @brief   全体セーブの必要があるか？
 *
 * @param   rsw
 *
 * @retval  int		TRUEなら全体セーブ・FALSEならフィールドセーブのみでOK
 */
//------------------------------------------------------------------
static int _all_save_check( REPORT_SUBLCD_WORK *rsw )
{
	return SaveData_GetTotalSaveFlag( rsw->fsys->savedata );
}

//------------------------------------------------------------------
/**
 * @brief   はい・いいえを選択したときの決定方法を渡す
 *
 * @param   kt_st
 * @param   type
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _set_decide_style( KEYTOUCH_STATUS *kt_st, int type )
{
	KeyTouchStatus_SetTouchOrKey( kt_st, type );

#if 0
	if( type==TOUCH_SW_RET_YES|| type==TOUCH_SW_RET_NO){

		KeyTouchStatus_SetTouchOrKey( kt_st, APP_END_KEY );

	}else if(type==TOUCH_SW_RET_YES_TOUCH||type==TOUCH_SW_RET_NO_TOUCH){

		KeyTouchStatus_SetTouchOrKey( kt_st, APP_END_TOUCH );

	}
#endif
}

//------------------------------------------------------------------
/**
 * @brief   不正対策メモリアロケーションその1
 */
//------------------------------------------------------------------
static void MagiconFunc1(void)
{
	sys_AllocMemoryLo( HEAPID_BASE_APP, 1000 );
}

//------------------------------------------------------------------
/**
 * @brief   不正対策メモリアロケーションその2
 */
//------------------------------------------------------------------
static void MagiconFunc2(void)
{
	sys_AllocMemoryLo( HEAPID_BASE_APP, 1000 );
}

//------------------------------------------------------------------
/**
 * @brief  正規版ロム関数
 */
//------------------------------------------------------------------
static void NotMagiconFunc(void)
{
}
